package initialize

import (
	"github.com/APP/global"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// GormMysql 初始化Mysql数据库
func GormMysql() *gorm.DB {
	m := global.APP_CONFIG.Mysql
	if m.Dbname == "" {
		return nil
	}
	mysqlConfig := mysql.Config{
		DSN:                       m.Dsn(), // DSN data source name
		DefaultStringSize:         191,     // string 类型字段的默认长度
		SkipInitializeWithVersion: false,   // 根据版本自动配置
	}
	if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig(m.LogMode)); err != nil {
		zap.L().Error("数据库初始化失败...")
		return nil
	} else {
		db.InstanceSet("gorm:table_options", "ENGINE="+m.Engine)
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(m.MaxIdleConns)
		sqlDB.SetMaxOpenConns(m.MaxOpenConns)
		return db
	}
}

// GormPgSql 初始化Postgresql数据库
func GormPgSql() *gorm.DB {
	p := global.APP_CONFIG.Pgsql
	if p.Dbname == "" {
		return nil
	}
	pgsqlConfig := postgres.Config{
		DSN:                  p.Dsn(), // DSN data source name
		PreferSimpleProtocol: false,
	}
	if db, err := gorm.Open(postgres.New(pgsqlConfig), gormConfig(p.LogMode)); err != nil {
		return nil
	} else {
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(p.MaxIdleConns)
		sqlDB.SetMaxOpenConns(p.MaxOpenConns)
		return db
	}
}

// GormSqlite 初始化Sqlite数据库
func GormSqlite() *gorm.DB {
	s := global.APP_CONFIG.Sqlite
	if s.Path == "" {
		return nil
	}

	if db, err := gorm.Open(sqlite.Open(s.Dsn()), gormConfig(s.LogMode)); err != nil {
		global.APP_LOG.Error("Sqlite启动异常", zap.Error(err))
		return nil
	} else {
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(s.MaxIdleConns)
		sqlDB.SetMaxOpenConns(s.MaxOpenConns)
		return db
	}
}

// gormConfig 根据配置决定是否开启日志
func gormConfig(mod string) *gorm.Config {
	var config = &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}
	switch mod {
	case "silent", "Silent":
		config.Logger = logger.Default.LogMode(logger.Silent)
	case "error", "Error":
		config.Logger = logger.Default.LogMode(logger.Error)
	case "warn", "Warn":
		config.Logger = logger.Default.LogMode(logger.Warn)
	case "info", "Info":
		config.Logger = logger.Default.LogMode(logger.Info)
	case "zap", "Zap":
		config.Logger = logger.Default.LogMode(logger.Info)
	default:
		config.Logger = logger.Default.LogMode(logger.Info)
	}
	return config
}

// InitDB 初始化数据库
func InitDB() {
	switch global.APP_CONFIG.System.DbType {
	case "mysql":
		global.APP_DB = GormMysql()
	case "pgsql":
		global.APP_DB = GormPgSql()
	case "sqlite":
		global.APP_DB = GormSqlite()
	default:
		global.APP_DB = GormMysql()
	}

	if global.APP_DB != nil {
		//// 自动迁移数据库表
		//err := global.APP_DB.AutoMigrate(
		//	&models.User{},
		//	&models.Role{},
		//	&models.Permission{},
		//	&models.JwtBlacklist{},
		//)
		//if err != nil {
		//	global.APP_LOG.Error("数据库迁移失败", zap.Error(err))
		//	os.Exit(0)
		//}
		global.APP_LOG.Info("数据库连接成功")
	}
}
